(function(global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('is-blob'))
    : typeof define === 'function' && define.amd ? define(['exports', 'moment', 'is-blob'], factory)
      : (factory((global.jqySaveFile = global.jqySaveFile || {}), global.moment, global.isBlob))
}(this, function(exports, moment, isBlob) {
  'use strict'

  moment = moment && 'default' in moment ? moment['default'] : moment
  isBlob = isBlob && 'default' in isBlob ? isBlob['default'] : isBlob

  /**
 * 校验是否url链接
 * @param url  ：url链接
 * @returns {Bool}：是否url链接
 */
  function CheckUrl(url) {
    var reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\/])+$/
    return reg.test(url)
  }

  /**
 * 校验是否base64Str字符串
 * @param base64Str  ：base64Str字符串
 * @returns {Bool}：是否base64Str字符串
 */
  function isBase64(base64Str) {
    var base64Pattern = /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i
    return base64Pattern.test(base64Str)
  }

  /**
 *下载或导出文件
 * @param blob  ：返回数据的blob对象
 * @param tagFileName  ：下载后文件名标记
 * @param fileType  ：文件类 word(docx) excel(xlsx) ppt等
 */
  function saveFileToBlob(blob, tagFileName, fileType) {
    if (fileType) {
      console.warn('未传入文件类型,例如文件类 word(docx) excel(xlsx) ppt jpg png等')
    }
    if (isBlob(blob)) {
      var downloadElement = document.createElement('a')
      var href = window.URL.createObjectURL(blob) // 创建下载的链接
      downloadElement.href = href
      downloadElement.download = (tagFileName || moment(new Date().getTime()).format('YYYYMMDDhhmmss')) + '.' + fileType // 下载后文件名
      document.body.appendChild(downloadElement)
      downloadElement.click() // 点击下载
      document.body.removeChild(downloadElement) // 下载完成移除元素
      window.URL.revokeObjectURL(href) // 释放掉blob对象
    } else {
      console.warn('不是blob对象类型的参数,可选择saveFileToBase64(Base64对象,文件类型)或saveFileToLink(文件链接,文件名,文件类型,进度回调方法)')
    }
  }

  /**
 * 下载base64对象文件
 * @param urlData  ：数据的base64对象
 * @param type  ：类型 image/png;
 * @param isToBlob  ：是否转换Blob对象 并返回 默认true
 * @returns {Blob}：Blob文件对象
 */
  function base64ToFileOrBlob(urlData, type) {
    var isToBlob = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true

    if (isBase64(urlData)) {
    // 判断是否是Base64字符串
      var arr = urlData.split(',')
      var array = arr[0].match(/:(.*?);/)
      var mime = (array && array.length > 1 ? array[1] : type) || type
      // 去掉url的头，并转化为byte
      var bytes = window.atob(arr[1])
      // 处理异常,将ascii码小于0的转换为大于0
      var ab = new ArrayBuffer(bytes.length)
      // 生成视图（直接针对内存）：8位无符号整数，长度1个字节
      var ia = new Uint8Array(ab)
      for (var i = 0; i < bytes.length; i++) {
        ia[i] = bytes.charCodeAt(i)
      }
      var blob = new Blob([ab], {
        type: mime
      })
      if (isToBlob) {
        return blob
      } else {
      // 切割
        var arrType = mime.split('/')
        var filetype = arrType[arrType.length - 1] // 文件类型
        saveFileToBlob(blob, '', filetype)
      }
    }
  }

  /**
 * 文件链接转文件流下载--主要针对pdf 解决谷歌浏览器a标签下载pdf直接打开的问题
 * @param url  ：文件链接
 * @param fileName  ：文件名;
 * @param type  ：文件类型;
 * @param fn  ：进度回调方法;
 */
  // 取消验证url
  function saveFileToLink(url, fileName, type, fn) {
    var xhr = new XMLHttpRequest()
    url = url.includes('https:') ? url.replace('https:', '') : url.replace('http:', '') // 资源路径动态获取请求的方式HTTPS或HTTP
    xhr.open('get', url, true)
    xhr.setRequestHeader('Content-Type', 'application/' + type)
    xhr.setRequestHeader('If-Modified-Since', '0') // 解决缓存问题,每次请求都去请求服务器获取最新数据
    xhr.responseType = 'blob'
    xhr.onprogress = function(e) {
      // 文件下载进度
      if (fn && typeof fn === 'function') {
        fn(e) // 监听文件下载进度;
      }
    }, xhr.onload = function() {
      if (this.status == 200) {
        // 接受二进制文件流
        var blob = this.response
        saveFileToBlob(blob, fileName, type)
      }
    }, xhr.send()
  }
  // function saveFileToLink(url, fileName, type, fn) {
  //   if (!CheckUrl(url)) {
  //     throw new Error('传入参数不合法,不是标准的文件链接')
  //   } else {
  //     var xhr = new XMLHttpRequest()
  //     url = url.includes('https:') ? url.replace('https:', '') : url.replace('http:', '') // 资源路径动态获取请求的方式HTTPS或HTTP
  //     xhr.open('get', url, true)
  //     xhr.setRequestHeader('Content-Type', 'application/' + type)
  //     xhr.setRequestHeader('If-Modified-Since', '0') // 解决缓存问题,每次请求都去请求服务器获取最新数据
  //     xhr.responseType = 'blob'
  //     xhr.onprogress = function(e) {
  //     // 文件下载进度
  //       if (fn && typeof fn === 'function') {
  //         fn(e) // 监听文件下载进度;
  //       }
  //     }, xhr.onload = function() {
  //       if (this.status == 200) {
  //       // 接受二进制文件流
  //         var blob = this.response
  //         saveFileToBlob(blob, fileName, type)
  //       }
  //     }, xhr.send()
  //   }
  // }

  exports.base64ToFileOrBlob = base64ToFileOrBlob
  exports.saveFileToBlob = saveFileToBlob
  exports.saveFileToLink = saveFileToLink

  Object.defineProperty(exports, '__esModule', { value: true })
}))
